package com.dongdongshop.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.dongdongshop.config.AlipayConfig;
import com.dongdongshop.em.ConstantEnum;
import com.dongdongshop.po.AlipayTradeQueryResponseResult;
import com.dongdongshop.pojo.StatusCode;
import com.dongdongshop.pojo.TbOrderItem;
import com.dongdongshop.service.TbOrderItemService;
import com.dongdongshop.service.TbOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("tradeController")
public class TradeController {
    @Reference
    private TbOrderItemService tbOrderItemService;
    @Reference
    private TbOrderService tbOrderService;
    /**
     *
     * @param WIDout_trade_no//订单号
     * @param WIDtotal_amount//付款金额
     * @param WIDsubject//订单名称
     * @param WIDbody//商品描述
     * @return
     */

    //付款
    @RequestMapping("alipayTradePagePay")
    @ResponseBody
    public String alipayTradePagePay(String WIDout_trade_no,String WIDtotal_amount,
                                     String WIDsubject,String WIDbody){

        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ WIDout_trade_no +"\","
                + "\"total_amount\":\""+ WIDtotal_amount +"\","
                + "\"subject\":\""+ WIDsubject +"\","
                + "\"body\":\""+ WIDbody +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //请求
        String result = null;
        try {
            result = alipayClient.pageExecute(alipayRequest).getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        //输出
        return result;
    }

    /**
     *
     * @param WIDTQout_trade_no 商户订单号
     * @param WIDTQtrade_no 支付宝交易号
     * @return
     */

    //交易查询
    @RequestMapping("alipayTradeQuery")
    @ResponseBody
    public StatusCode alipayTradeQuery(String WIDTQout_trade_no, String WIDTQtrade_no){
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();

        //请二选一设置

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ WIDTQout_trade_no +"\","+"\"trade_no\":\""+ WIDTQtrade_no +"\"}");

        //请求
        String result = null;
        try {
            result = alipayClient.execute(alipayRequest).getBody();
            AlipayTradeQueryResponseResult result1 = JSONObject.parseObject(result, AlipayTradeQueryResponseResult.class);
            //输出
            return StatusCode.build(ConstantEnum.SUCCESS).setT(result1);
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return StatusCode.build(ConstantEnum.ERROR);
        }

    }

    /**
     *
     * @param WIDTRout_trade_no 商户订单号
     * @param WIDTRtrade_no 支付宝交易号
     * @param WIDTRrefund_amount 需要退款的金额
     * @param WIDTRrefund_reason 退款的原因说明
     * @param WIDTRout_request_no 标识一次退款请求，同一笔交易多次退款需要保证唯一，如需部分退款，则此参数必传
     * @return
     */
    //退款
    @RequestMapping("aliPayrefund")
    public String aliPayrefund(String WIDTRout_trade_no,String WIDTRtrade_no,String WIDTRrefund_amount,
                                   String WIDTRrefund_reason,String WIDTRout_request_no,Long orderId){
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ WIDTRout_trade_no +"\","
                + "\"trade_no\":\""+ WIDTRtrade_no +"\","
                + "\"refund_amount\":\""+ WIDTRrefund_amount +"\","
                + "\"refund_reason\":\""+ WIDTRrefund_reason +"\","
                + "\"out_request_no\":\""+ WIDTRout_request_no +"\"}");

        //请求
        String result = null;
        try {
            result = alipayClient.execute(alipayRequest).getBody();
            System.out.println("进入退款》》》》》》");
            Long orderid = Long.parseLong(WIDTRout_request_no);
            //退款后删除
            tbOrderItemService.deleteByOrderId(orderid);
            //查询当前订单号下的商品
               TbOrderItem tbOrderItem = tbOrderItemService.selectByOutTradeNo(orderId);
               //如果该订单下没有的商品删除商家订单信息
            if (tbOrderItem == null){
                   tbOrderService.deleteByOutTradeNo(orderId);
            }

            System.out.println("退款成功");
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        //输出
        return "home-order-send";
    }
}
